# MappableSuperClassConfiguration.java

    package org.codefilarete.stalactite.dsl;

    import java.util.NoSuchElementException;
    import javax.annotation.Nullable;

    import org.codefilarete.tool.collection.ReadOnlyIterator;

    /**
     * Technical sharing of inheritance abilities of {@link org.codefilarete.stalactite.dsl.entity.EntityMappingConfiguration}
     * and {@link org.codefilarete.stalactite.dsl.embeddable.EmbeddableMappingConfiguration}
     *
     * @param <C>
     * @author Guillaume Mary
     */
    public interface MappableSuperClassConfiguration<C> {

    	/**
    	 *
    	 * @return the configuration of a parent type
    	 */
    	@SuppressWarnings("squid:S1452" /* Can't remove wildcard here because it requires to create a local generic "super" type which is forbidden */)
    	@Nullable
    	MappableSuperClassConfiguration<? super C> getMappedSuperClassConfiguration();

    	/**
    	 * @return an iterable for all inheritance configurations, including this
    	 */
    	default Iterable<? extends MappableSuperClassConfiguration<?>> inheritanceIterable() {

    		return () -> new ReadOnlyIterator<MappableSuperClassConfiguration<?>>() {

    			private MappableSuperClassConfiguration<?> next = MappableSuperClassConfiguration.this;

    			@Override
    			public boolean hasNext() {
    				return next != null;
    			}

    			@Override
    			public MappableSuperClassConfiguration<?> next() {
    				if (!hasNext()) {
    					// comply with next() method contract
    					throw new NoSuchElementException();
    				}
    				MappableSuperClassConfiguration<?> result = this.next;
    				this.next = this.next.getMappedSuperClassConfiguration();
    				return result;
    			}
    		};
    	}
    }